/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.servinf.ani.mapper;

import com.servinf.ani.sincronizador.App;
import com.servinf.ani.sincronizador.entities.Ambiental;
import com.servinf.ani.sincronizador.entities.EstadoIntervencion;
import com.servinf.ani.sincronizador.entities.Intervencion;
import com.servinf.ani.sincronizador.entities.Planeacion;
import com.servinf.ani.sincronizador.entities.Predial;
import com.servinf.ani.sincronizador.entities.Social;
import com.servinf.ani.sincronizador.entities.TipoIntervencion;
import com.servinf.ani.sincronizador.entities.TramoVia;
import com.servinf.ani.sincronizador.exception.IncompatibleTypesException;
import com.servinf.ani.sincronizador.exception.NonExistentValue;
import com.servinf.ani.sincronizador.exception.NullAssignmentType;
import com.servinf.ani.sincronizador.utils.LogHelper;
import com.servinf.ani.sincronizador.utils.RelationMaps;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.poi.ss.usermodel.DateUtil;

/**
 * Campos presentes en la hoja de Asignaciones del archivo excel.
 * @author David
 */
 public class AssignmentMapper {
    
    //Indices de los campos en el archivo excel
    public static final int IdDelProyecto = 0;
    public static final int IdDeLaAsignación = 1;
    public static final int NombreDeProyecto = 2;
    public static final int IdDeTarea = 3;
    public static final int NombreDeLaTarea = 4;
    public static final int Área_T = 5;
    public static final int AbscisaInicio_T = 6;
    public static final int AbscisaFin_T = 7;
    public static final int Deptoregional_T = 8;
    public static final int UnidaddeMedida_T = 9;
    public static final int LongitudContractual_T = 10;
    public static final int TipodeActividad_T = 11;
    public static final int Calzada_T = 12;
    public static final int PrediosRequeridos_T = 13;
    public static final int Prediosdisponibles_T = 14;
    public static final int LongPrediosDisp_T = 15;
    public static final int Prediosconproblemas_T = 16;
    public static final int LongPrediosProblemas_T = 17;
    public static final int PrediosEnajenaciónVoluntaria_T = 18;
    public static final int PrediosExpropiación_T = 19;
    public static final int ProyectodeConcesión_T = 20;
    public static final int EtapadeProyecto_T = 21;
    public static final int NúmerodeAccidentes_T = 22;
    public static final int NúmerodeMuertos_T = 23;
    public static final int NúmerodeHeridos_T = 24;
    public static final int Tramo_T = 25;
    public static final int Aportaalameta_T = 26;
    public static final int EstadoTrámite_T = 27;
    public static final int Actores_T = 28;
    public static final int FechadeRadicación_T = 29;
    public static final int FechadePronunciamiento_T = 30;
    public static final int ProcentajeCompletado = 31;
    public static final int Trabajo = 32;
    public static final int Trabajoreal = 33;
    public static final int FechaDeInicioDeLaAsignación2 = 34;
    public static final int FechaDEFinalizaciónDeLaAsignación2 = 35;


    private static List<String> camposAmbiental;
    private static List<String> camposSocial;
    private static List<String> camposPredial;
    private static List<String> camposPlaneacion;
    
    private static boolean setup = false;

    public static String currentField;
    
    private static void setup(){
        
        camposAmbiental = new ArrayList<String>();
        camposAmbiental.add("Trámite Ambiental");
        camposAmbiental.add("Modificaciones a la Licencia Ambiental");
        camposAmbiental.add("Suspendida Licencia Ambiental");
        camposAmbiental.add("Licencia Ambiental");
        camposAmbiental.add("Permisos Ambientales PAGA");
        
        camposSocial  = new ArrayList<String>();
        camposSocial.add("Consultas Previas");
        
        camposPredial  = new ArrayList<String>();
        camposPredial.add("Gestión Predial");
        
        camposPlaneacion = new ArrayList<String>();
        camposPlaneacion.add("Construcción calzada sencilla");
        camposPlaneacion.add("Const. De puente vehicular");
        camposPlaneacion.add("Const. De túnel");
        camposPlaneacion.add("Construcción de Estación de peaje");
        camposPlaneacion.add("Construcción de viaducto");
        camposPlaneacion.add("Construcción doble calzada");
        camposPlaneacion.add("Construcción segunda calzada");
        
        setup = true;
        
    }
    
    public static Intervencion excelToAssignment(List<Object> excelRow, Intervencion assignment) throws IncompatibleTypesException, NullAssignmentType {
        if(!setup) {
            setup();
        }
        try {
            boolean isCreating = false;
            /*** Mapeo de la itervención. ***/
            if(assignment == null)  {
                assignment = new Intervencion();
                isCreating = true;
                //project.setIdProyecto(new Integer(0));
            }            

            currentField = "IdDeLaAsignación";
            assignment.setIdIntervencionProject((String)excelRow.get(IdDeLaAsignación));
            
            if(excelRow.get(NombreDeLaTarea) != null) { 
                currentField = "NombreDeLaTarea";
                assignment.setNombreTarea((String) excelRow.get(NombreDeLaTarea));
            }

            boolean aportaAMeta = false;
            if(excelRow.get(Aportaalameta_T) != null) {
                currentField = "Aportaalameta_T";
                aportaAMeta = Boolean.parseBoolean((String) excelRow.get(Aportaalameta_T));
            }

            if(excelRow.get(Tramo_T) != null)  {
                currentField = "Tramo_T";
                String value = (String) excelRow.get(Tramo_T);
                Integer laneId = RelationMaps.getInstance().getLanesMap().get(value);
                if(laneId == null) {   
                    throw new NonExistentValue(value);
                }
                assignment.setIdTramoVia(laneId);
            }

            
            if(excelRow.get(FechaDeInicioDeLaAsignación2) != null) {
                currentField = "FechaDeInicioDeLaAsignación2";
                Double dateNumeric = (Double) excelRow.get(AssignmentMapper.FechaDeInicioDeLaAsignación2);
                Date date = DateUtil.getJavaDate(dateNumeric);
                assignment.setFechaInicio(date);
            }
            
            
            if(excelRow.get(FechaDEFinalizaciónDeLaAsignación2) != null) {
                currentField = "FechaDEFinalizaciónDeLaAsignación2";
                Double dateNumeric = (Double) excelRow.get(AssignmentMapper.FechaDEFinalizaciónDeLaAsignación2);
                Date date = DateUtil.getJavaDate(dateNumeric);
                assignment.setFechaFinalizacion(date);
             }
            
            /*
            if(excelRow.get(ProcentajeCompletado) != null) { 
                currentField = "%completado";
                assignment.setNombreTarea((String) excelRow.get(NombreDeLaTarea));
            }*/
            
            
            if(excelRow.get(TipodeActividad_T) != null)  {
                currentField = "TipodeActividad_T";
                String value = (String) excelRow.get(TipodeActividad_T);
                Integer typeId = RelationMaps.getInstance().getAssignmentTypeMap().get(value);
                    //Si no se encuentra el tipo de intervención, este puede ser nulo y se guarda la intervención.
                    if(typeId != null) {
                       assignment.setTipoIntervencion(new TipoIntervencion(typeId));
                    }else {
                       throw new NullAssignmentType("La intervención " + assignment.getIdIntervencionProject() + " no tiene Tipo de actividad no se puede actualizar / crear");
                    }
                    
                if(isCreating) {
                    return assignment;
                }

                //PREDIAL
                if(camposPredial.contains(value)) {
                    Predial predial = AreaMapper.getPredial(excelRow, assignment.getPredial(), assignment.getIdIntervencion());
                    assignment.setPredial(predial);
                }

                //SOCIAL
                if(camposSocial.contains(value)) {
                    Social social = AreaMapper.getSocial(excelRow, assignment.getSocial(),  assignment.getIdIntervencion());
                    assignment.setSocial(social);
                }

                //AMBIENTAL
                if(camposAmbiental.contains(value)) {
                    Ambiental ambiental = AreaMapper.getAmbiental(excelRow, assignment.getAmbiental(),  assignment.getIdIntervencion());
                    assignment.setAmbiental(ambiental);
                }

                //PLANEACIÓN
                if(aportaAMeta && camposPlaneacion.contains(value)) {
                    Planeacion planeacion = AreaMapper.getPlaneacion(excelRow, assignment.getPlaneacion() ,  assignment.getIdIntervencion());
                    assignment.setPlaneacion(planeacion);
                }
                return assignment;
            }else {
                 throw new NullAssignmentType("La intervención " + assignment.getIdIntervencionProject() + " no tiene Tipo de actividad no se puede actualizar / crear");
            }
            
            //assignment.setEstadoIntervencion(null);
            /*
            SimpleDateFormat format = new SimpleDateFormat(App.getDateFormatString());
           if(excelRow.get(Festimadodeterminación) != null) {
                currentField = "Festimadodeterminación";
                Double dateNumeric = (Double) excelRow.get(Festimadodeterminación);
                Date date = DateUtil.getJavaDate(dateNumeric);
                project.getConcesionList().get(0).setFechaActaInicio(date);
            }*/

        }catch(ParseException pe) {
            throw new IncompatibleTypesException("Error de lectura de en el campo " + currentField + " : " + pe.getMessage() + " Id Intervencion -> " 
                                + assignment.getIdIntervencionProject());
        } catch(NonExistentValue ne) {
            try {
                LogHelper.Log(LogHelper.ERROR, "En excel viene un valor como llave que no se puede resolver en BD para el campo " + currentField + " Id Intervencion -> " 
                                + assignment.getIdIntervencionProject(), ne);
            } catch (IOException ex) {
                Logger.getLogger(ProjectMapper.class.getName()).log(Level.SEVERE, null, ex);
            }
        }catch (NullAssignmentType ex) {
            try {
                LogHelper.Log(LogHelper.ERROR, ex.getMessage(), ex);
            } catch (IOException ex1) {
                Logger.getLogger(AssignmentMapper.class.getName()).log(Level.SEVERE, null, ex1);
            }
        }
        return null;
        
        
    }
    
    public static TramoVia excelToLane(List<Object> excelRow, TramoVia lane) throws IncompatibleTypesException {
      //try {
            boolean isCreating = false;
            /*** Mapeo del proyecto ***/
            if(lane == null)  {
                lane = new TramoVia();
                isCreating = true;
                //project.setIdProyecto(new Integer(0));
            }            
     /*   }catch(ParseException pe) {
            throw new IncompatibleTypesException("Error de lectura de fechas en el campo " + currentField + " : " + pe.getMessage());
        }catch(ClassCastException ce) {
            throw new IncompatibleTypesException("Error de conversion de tipos en el campo " + currentField + " : " + ce.getMessage());
        }catch(NonExistentValue ne) {
            try {
                LogHelper.Log(LogHelper.ERROR, "En excel viene un valor como llave que no se puede resolver en BD para el campo " + currentField, ne);
            } catch (IOException ex) {
                Logger.getLogger(LaneMapper.class.getName()).log(Level.SEVERE, null, ex);
            }
        }catch(DifferentLengthException e) {
            try {
                LogHelper.Log(LogHelper.ERROR, "Longitudes diferentes en informacion de departamentos " + currentField, e);
            } catch (IOException ex) {
                Logger.getLogger(LaneMapper.class.getName()).log(Level.SEVERE, null, ex);
            }
        }*/
        return null;
        
    }
    
}
